package controllers

import (
	"errmsg"
	"errors"
	"github.com/astaxie/beego/logs"
	"github.com/astaxie/beego/validation"
	"regexp"
	"smart_home/api/models"
)

type TimingController struct {
	BaseController
}

// @Title Create
// @Description 添加定时任务
// @router / [post]
func (c *TimingController) Post() {
	var (
		tm  *models.Timing
		err error
	)

	tm = &models.Timing{}
	if err = c.ParseData(tm); err != nil {
		logs.Error(err)
		c.Error(errmsg.ErrResponseParameter)
		return
	}

	if err = c.validate(tm); err != nil {
		c.Error(err)
		return
	}

	if !models.AddTiming(tm) {
		c.Error(errors.New("添加失败，请检查设备是否已经联网"))
		return
	}

	c.Success(nil)
}

func (c *TimingController) validate(tm *models.Timing) error {
	vali := validation.Validation{}
	vali.Required(tm.Sta, "sta").Message("sta不能为空")
	vali.Required(tm.Wkocc, "wkocc").Message("wkocc不能为空")
	if vali.HasErrors() {
		logs.Info(vali.Errors[0])
		return vali.Errors[0]
	}

	if len(tm.Start) == 0 && len(tm.End) == 0 {
		err := errors.New("打开时间和关闭时间至少填写一项")
		logs.Info(err)
		return err
	}

	if tm.Start == tm.End {
		err := errors.New("打开时间和关闭时间不能相同")
		logs.Info(err)
		return err
	}
	reg := regexp.MustCompile(`([0-1][0-9]|2[0-3]):([0-5][0-9])`)
	if len(tm.Start) > 0 {
		vali.Match(tm.Start, reg, "start").Message("打开时间格式有误")
	}
	if len(tm.End) > 0 {
		vali.Match(tm.End, reg, "end").Message("关闭时间格式有误")
	}
	reg = regexp.MustCompile(`[01]{7}`)
	vali.Match(tm.Wkocc, reg, "wkocc").Message("wkocc的值有7位0个1的数字组成")
	if vali.HasErrors() {
		err := vali.Errors[0]
		logs.Info(err)
		return err
	}

	// 判断用户是否有操作权限
	isAuth, err := models.IsEquipmentAuth(c.User.Id, tm.Sta)
	if err != nil {
		return errmsg.ErrResponseAuth
	}
	if !isAuth {
		return errmsg.ErrResponseAuth
	}

	// 判断用户的定时任务数量
	count, err := models.GetTimingCountBySta(tm.Sta)
	if err != nil {
		logs.Info(err)
		return errmsg.ErrResponseSystem
	}
	if count > 15 {
		err = errors.New("定时任务已达到最大数量")
		logs.Info(err)
		return errmsg.ErrResponseSystem
	}

	return nil
}

// @Title Create
// @Description 添加定时任务
// @router /info/:id [put]
func (c *TimingController) Put() {
	var (
		id  string
		tm  *models.Timing
		err error
	)

	id = c.GetString(":id")
	if tm, err = models.GetTimingById(id); err != nil {
		c.Error(errmsg.ErrResponseSystem)
		return
	}
	if tm == nil {
		logs.Info(errmsg.ErrResponseNotFound)
		c.Error(errmsg.ErrResponseNotFound)
		return
	}

	if err = c.ParseData(tm); err != nil {
		logs.Error(err)
		c.Error(errmsg.ErrResponseParameter)
		return
	}

	if err = c.validate(tm); err != nil {
		c.Error(err)
		return
	}

	if !models.UpdateTiming(tm) {
		c.Error(errors.New("修改失败，请检查设备是否已经联网"))
		return
	}

	c.Success(nil)
}

// @Title GetAll
// @Description 获取定时任务列表
// @param sta path false "设备sta"
// @router /:sta [get]
func (c *TimingController) GetAll() {
	var (
		sta    string
		err    error
		ls     []*models.Timing
		isAuth bool
	)

	sta = c.GetString(":sta")

	// 判断用户是否有查看定时任务的权限
	if isAuth, err = models.IsEquipmentAuth(c.User.Id, sta); err != nil {
		c.Error(errmsg.ErrResponseSystem)
		return
	}
	if !isAuth {
		logs.Info(errmsg.ErrResponseAuth)
		c.Error(errmsg.ErrResponseAuth)
		return
	}

	if ls, err = models.GetAllTimingBySta(sta); err != nil {
		c.Error(errmsg.ErrResponseSystem)
		return
	}

	c.Success(ls)
}

// @Title GetAll
// @Description 获取定时任务列表
// @param sta path false "设备sta"
// @router /info/:id [get]
func (c *TimingController) Get() {
	var (
		id     string
		err    error
		tm     *models.Timing
		isAuth bool
	)

	id = c.GetString(":id")
	if tm, err = models.GetTimingById(id); err != nil {
		c.Error(errmsg.ErrResponseSystem)
		return
	}
	if tm == nil {
		logs.Info(errmsg.ErrResponseNotFound)
		c.Error(errmsg.ErrResponseNotFound)
		return
	}

	// 判断用户是否有查看定时任务的权限
	if isAuth, err = models.IsEquipmentAuth(c.User.Id, tm.Sta); err != nil {
		c.Error(errmsg.ErrResponseSystem)
		return
	}
	if !isAuth {
		logs.Info(errmsg.ErrResponseAuth)
		c.Error(errmsg.ErrResponseAuth)
		return
	}

	c.Success(tm)
}

// @Title Delete
// @Description 删除设备
// @Param	id		path 	string	true		"sta"
// @router /info/:id [delete]
func (c *TimingController) Delete() {
	var (
		id     string
		err    error
		tm     *models.Timing
		isAuth bool
	)

	id = c.GetString(":id")
	if tm, err = models.GetTimingById(id); err != nil {
		c.Error(errmsg.ErrResponseSystem)
		return
	}
	if tm == nil {
		logs.Info(errmsg.ErrResponseNotFound)
		c.Error(errmsg.ErrResponseNotFound)
		return
	}

	// 判断用户是否有查看定时任务的权限
	if isAuth, err = models.IsEquipmentAuth(c.User.Id, tm.Sta); err != nil {
		c.Error(errmsg.ErrResponseSystem)
		return
	}
	if !isAuth {
		logs.Info(errmsg.ErrResponseAuth)
		c.Error(errmsg.ErrResponseAuth)
		return
	}

	if !models.DelTiming(tm) {
		c.Error(errors.New("删除失败，请检查设备是否已经联网"))
		return
	}

	c.Success(nil)
}
